#include <iostream>
// 19
// 1^2 + 9^2 = 82
// 8^2 + 2^2 = 68
// 6^2 + 8^2 = 100
// 1^2 + 0^2 + 0^2 = 1
// 19 是一个快乐数

// 计算 n 的数位平方和
// 1234 = 1 2 3 4
//                商      余数
// 1234 / 10     123      4
// 123 / 10      12       3
// 12 / 10       1        2
// 1 / 10        0        1
int sumDigits(int n) {
  int result = 0;

  while (n != 0) {
    result += (n % 10) * (n % 10);
    n = n / 10;
  }

  return result;
}

// 来思考 n 不是快乐数的情况
// 在程序里如何判别 n 不是一个快乐数
// 如果我们能在后续的计算结果里，找到之前曾经算出来过的和，n 不是一个快乐数。
// 116 => 38 => 73 => 58 => 89 => 145 => 42 => 20 => 4 => 16 => 37
//                    58 => 89 => 145 => 42 => 20 => 4 => 16 => 37
//                    58 => 89 => 145 => 42 => 20 => 4 => 16 => 37


// 判断一个数字 n 是否位快乐数：
// 如果收敛到 1，那么 n 是快乐数；
// 如果存在循环，n 不是快乐数；
// sumDigits 会不会越加越大，导致最终这个和会趋向于无穷大，进而导致 n 不是快乐数，存在这种情况么？
// 9    -> 81
// 99   -> 162
// 999  -> 243
// 9999 -> 324 => 四位数字他的数位平方和会降级一位
// ...
// 9999999999999 -> 1053 => 十三位数字，他的数位平方和会降 9 级
// 数字 n，它的位数越大，计算之后，降级的就越多



bool isHappyNumber(int n) {
  // 假设 n 是快乐数的情况
  while (n != 1) {
    n = sumDigits(n);
    cout << n << " ";
  }

  return true;
}

bool isHappyNumber1(int n) {
  int slow = n;
  int fast = sumDigits(n);

  // 什么情况下，乌龟和兔子可以一起往前跑？
  // 1. 兔子的位置不能等于 1
  // 2. 兔子和乌龟的数值不能相等
  while (fast != 1 && slow != fast) {
    slow = sumDigits(slow);

    fast = sumDigits(fast);
    fast = sumDigits(fast);
  }

  if (fast == 1) {
    return true;
  }
  else {
    return false;
  }
}

int main() {

}
